<!DOCTYPE html>
<html lang="ar">
	<head>
		<meta charset="utf-8" />
		<base href="../../../" />
		<script src="page.js"></script>
		<link type="text/css" rel="stylesheet" href="page.css" />
	</head>
	<body class="rtl">
		<h1>[name]</h1>

		<p class="desc">
			الموحدات هي متغيرات GLSL عالمية. يتم تمريرها إلى برامج الشادر.
		</p>
			
		<h2>مثال الكود</h2>
		<p>
			عند إعلان موحد من [page:ShaderMaterial]، يتم إعلانه بواسطة
			القيمة أو بالكائن.
		</p>
		<code>
		uniforms: {
		time: { value: 1.0 }, 
		resolution: new Uniform( new Vector2() )
		};
		</code>
			
		<h2>أنواع الموحدات (Uniform types)</h2>
		<p>
			يجب أن يكون لكل موحد خاصية `value`. يجب أن يتوافق نوع القيمة
			مع نوع المتغير الموحد في كود GLSL كما
			محدد لأنواع GLSL البدائية في الجدول أدناه. موحد
			الهياكل والمصفوفات مدعومة أيضًا. يجب تحديد مصفوفات GLSL من نوع بدائي
			إما كمصفوفة من كائنات THREE المقابلة أو
			كمصفوفة مسطحة تحتوي على بيانات جميع الكائنات. بعبارة أخرى؛
			يجب عدم تمثيل المتغيرات البدائية في GLSL في المصفوفات بواسطة المصفوفات. هذه القاعدة
			لا تطبق ترانزيتيفًا. يجب أن تكون مصفوفة من مصفوفات `vec2`، كل منها بطول
			خمسة متجهات، يجب أن تكون مصفوفة من المصفوفات، من خمسة [page:Vector2]
			كائنات أو عشرة `number`s.
		</p>

		<table>
			<caption>
				<a id="uniform-types">Uniform types</a>
			</caption>
			<thead>
				<tr>
					<th>GLSL type</th>
					<th>JavaScript type</th>
				</tr>
			</thead>
			<tbody>
				<tr>
					<td>int</td>
					<td>[page:Number]</td>
				</tr>
				<tr>
					<td>uint</td>
					<td>[page:Number]</td>
				</tr>
				<tr>
					<td>float</td>
					<td>[page:Number]</td>
				</tr>
				<tr>
					<td>bool</td>
					<td>[page:Boolean]</td>
				</tr>
				<tr>
					<td>bool</td>
					<td>[page:Number]</td>
				</tr>
				<tr>
					<td>vec2</td>
					<td>[page:Vector2 THREE.Vector2]</td>
				</tr>
				<tr>
					<td>vec2</td>
					<td>[page:Float32Array Float32Array] (*)</td>
				</tr>
				<tr>
					<td>vec2</td>
					<td>[page:Array Array] (*)</td>
				</tr>
				<tr>
					<td>vec3</td>
					<td>[page:Vector3 THREE.Vector3]</td>
				</tr>
				<tr>
					<td>vec3</td>
					<td>[page:Color THREE.Color]</td>
				</tr>
				<tr>
					<td>vec3</td>
					<td>[page:Float32Array Float32Array] (*)</td>
				</tr>
				<tr>
					<td>vec3</td>
					<td>[page:Array Array] (*)</td>
				</tr>
				<tr>
					<td>vec4</td>
					<td>[page:Vector4 THREE.Vector4]</td>
				</tr>
				<tr>
					<td>vec4</td>
					<td>[page:Quaternion THREE.Quaternion]</td>
				</tr>
				<tr>
					<td>vec4</td>
					<td>[page:Float32Array Float32Array] (*)</td>
				</tr>
				<tr>
					<td>vec4</td>
					<td>[page:Array Array] (*)</td>
				</tr>
				<tr>
					<td>mat2</td>
					<td>[page:Float32Array Float32Array] (*)</td>
				</tr>
				<tr>
					<td>mat2</td>
					<td>[page:Array Array] (*)</td>
				</tr>
				<tr>
					<td>mat3</td>
					<td>[page:Matrix3 THREE.Matrix3]</td>
				</tr>
				<tr>
					<td>mat3</td>
					<td>[page:Float32Array Float32Array] (*)</td>
				</tr>
				<tr>
					<td>mat3</td>
					<td>[page:Array Array] (*)</td>
				</tr>
				<tr>
					<td>mat4</td>
					<td>[page:Matrix4 THREE.Matrix4]</td>
				</tr>
				<tr>
					<td>mat4</td>
					<td>[page:Float32Array Float32Array] (*)</td>
				</tr>
				<tr>
					<td>mat4</td>
					<td>[page:Array Array] (*)</td>
				</tr>
				<tr>
					<td>ivec2, bvec2</td>
					<td>[page:Float32Array Float32Array] (*)</td>
				</tr>
				<tr>
					<td>ivec2, bvec2</td>
					<td>[page:Array Array] (*)</td>
				</tr>
				<tr>
					<td>ivec3, bvec3</td>
					<td>[page:Int32Array Int32Array] (*)</td>
				</tr>
				<tr>
					<td>ivec3, bvec3</td>
					<td>[page:Array Array] (*)</td>
				</tr>
				<tr>
					<td>ivec4, bvec4</td>
					<td>[page:Int32Array Int32Array] (*)</td>
				</tr>
				<tr>
					<td>ivec4, bvec4</td>
					<td>[page:Array Array] (*)</td>
				</tr>
				<tr>
					<td>sampler2D</td>
					<td>[page:Texture THREE.Texture]</td>
				</tr>
				<tr>
					<td>samplerCube</td>
					<td>[page:CubeTexture THREE.CubeTexture]</td>
				</tr>
			</tbody>
		</table>

		<p>
			(*) نفس الشيء بالنسبة لمصفوفة (الأبعاد الداخلية) من نفس نوع GLSL،
			تحتوي على مكونات جميع المتجهات أو المصفوفات في المصفوفة.
		</p>
		 
		<h2>الزي المنظم (Structured Uniforms)</h2>
		 
		<p>
			في بعض الأحيان ترغب في تنظيم الزي كـ `structs` في كود الشيدر الخاص بك.
			يجب استخدام النمط التالي حتى يتمكن `three.js` من معالجة
			بيانات الزي المنظمة.
		</p>
		<code>
		uniforms = {
		data: { 
		value: {
		position: new Vector3(), 
		direction: new Vector3( 0, 0, 1 ) 
		} 
		} 
		};
		</code>
		يمكن تعيين هذا التعريف على كود GLSL التالي:
		<code>
		struct Data { 
		vec3 position;
		vec3 direction;
		};
		uniform Data data;
		</code>
		 
		<h2>الزي المنظم مع المصفوفات (Structured Uniforms with Arrays)</h2>
		 
		<p>
			من الممكن أيضًا إدارة `structs` في المصفوفات. تبدو صياغة هذه الحالة
			الاستخدام كما يلي:
		</p>
		<code>
		const entry1 = {
		position: new Vector3(),
		direction: new Vector3( 0, 0, 1 )
		};
		const entry2 = {
		position: new Vector3( 1, 1, 1 ),
		direction: new Vector3( 0, 1, 0 )
		};
		 
		uniforms = {
		data: {
		value: [ entry1, entry2 ]
		}
		};
		</code>
		يمكن تعيين هذا التعريف على كود GLSL التالي:
		<code>
		struct Data { 
		vec3 position; 
		vec3 direction; 
		};
		uniform Data data[ 2 ];
		</code>
		 
		<h2>المنشئ (Constructor)</h2>
		 
		<h3>[name]( [param:Object value] )</h3>
		<p>
			value -- كائن يحتوي على القيمة لإعداد الزى. يجب أن يكون نوعه
			واحدًا من أنواع الزى المذكورة أعلاه.
		</p>
		 
		<h2>الخصائص (Properties)</h2>
		 
		<h3>[property:Object value]</h3>
		<p>القيمة الحالية للزى.</p>
		 
		<h2>الوظائف (Methods)</h2>
		 
		<h3>[method:Uniform clone]()</h3>
		<p>
			يعود بنسخة من هذا الزى. <br />
			إذا كانت خاصية قيمة الزى هى [page:Object] مع طريقة clone()،
			يتم استخدام هذا، وإلا يتم نسخ القيمة عن طريق التعيين. تتشارك قيم المصفوفات بين [page:Uniform]s المنسوخة.
		</p>
			
		<h2>المصدر (Source)</h2>

		<p>
			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
		</p>
	</body>
</html>
